/**
  JS对象的 静态方法
    Object.create(proto，[propertiesObject])
     作用：创建 一个带有指定原型对象  新对象，
              使用现有的对象来提供新创建的对象的__proto__
     参数：
      1. proto：新创建对象的原型对象。
      2. propertiesObject：可选。需要传入一个对象，
          该对象的属性类型参照Object.defineProperties()的第二个参数。
          value/configurable/enumerable/writable/get/set
          这个参数的值会作为创建出来新对象的属性
      返回值：返回一个新对象，带着指定的原型对象和属性。
      注意：如果proto参数不是 null 或非原始包装对象，则抛出一个 TypeError 异常。
*/
// 定义对象
// const obj = {
//   name: '李沁',
//   feature: ['气质', '美丽']
// }
// const proto = Object.create(obj)
// console.log(proto)
// 等同于
// Object.create的效果 等同于 下方代码
// const o = {}
// Object.setPrototypeOf(o, obj)
// console.log(o)

// 如果创建出来的新对象不需要原型对象和属性
// const proto = Object.create(null)
// console.log(proto) // ? 此时的 proto 是一个纯粹的空对象，不含任何 属性 和 方法

// 如果创建出来的新对象 需要带属性，则可以传入第二个参数
const obj = {
  name: '李沁',
  feature: ['气质', '美丽']
}
// 添加身高 和 主演的电视剧
const proto = Object.create(obj, {
  // 身高
  height: {
    value: 166,
    configurable: true,
    enumerable: true,
    writable: true,
    // get () {

    // },
    // set () {

    // }
  },
  // 主演的电视剧
  master: {
    value: ['庆余年', '楚乔传'],
    configurable: true,
    enumerable: true,
    writable: true,
    // get () {

    // },
    // set () {

    // }
  }
})
// console.log(proto)


// Obejct.create方法应用场景：
// 1. 继承
function Mobile (brand, price) {
  this.brand = brand
  this.price = price
}
Mobile.prototype.makeCall = function () {
  console.log('makeCall')
}
Mobile.prototype.sendMsg = function () {
  console.log('sendMsg')
}

function NewMobile (brand, price, type) {
  Mobile.call(this, brand, price)
  // Mobile.apply(this, [brand, price])
  this.type = type
}
NewMobile.prototype = Object.create(Mobile.prototype)
// 给新手机的 原型对象 扩展一个 支付 的方法
NewMobile.prototype.pay = function () {
  console.log('pay')
}

console.log(Mobile.prototype)
console.log(NewMobile.prototype)

// 创建两部手机对象
const m = new Mobile('Vivo', '深蓝')
const nm = new NewMobile('华为', '黑色', 'Mate40 Pro')

// nm.makeCall()
// nm.sendMsg()
// nm.pay()

// m.makeCall()
// m.sendMsg()
// m.pay() // ? 报错
// 2. 创建一个不带任何原型和属性的新对象
const o = new Object()
console.log(o)
// o.__proto === Object.prototype
// const o = Object.create(null)
// console.log(o)


